/*
 * IdJugador.h
 *
 *  Created on: 07/01/2010
 *      Author: San Martín, Matías I.
 */

#ifndef IDJUGADOR_H_
#define IDJUGADOR_H_

#include "../Common/CommonTypes.h"

//TODO CAMBIAR DE LUGAR ESTO, EL MIDDLEWARE NO PUEDE DEPENDER DE LA APLICACION
#include "../../Aplicacion/Common/Mensajes/MensajesCommonTypes.h"

#include "IdJuego.h"

/**
 * Represeenta un identificador de jugador dentro del sistema (local a un jugador)
 */
class IdJugador {

//------------------------------ CONSTANTES ------------------------------
public:
	static const T_ID_JUGADOR ID_UNDEFINED = -1;
//------------------------------ ATRIBUTOS ------------------------------
private:
	T_ID_JUGADOR _id;
	IdJuego _idContainer;

//------------------------------ METODOS ------------------------------
public:

	IdJugador() :
		_id(ID_UNDEFINED) {
	}

	IdJugador(T_ID_JUGADOR id) :
		_id(id) {
	}

	IdJugador(T_ID_JUGADOR id, IdJuego idContenedor) :
		_id(id), _idContainer(idContenedor)
	{
	}

	virtual ~IdJugador(){}

	void setId(T_ID_JUGADOR id) {
		_id = id;
	}

	T_ID_JUGADOR getId() const {
		return _id;
	}

	/**
	 * Asigna el identificador neutral (ninguno)
	 */
	void setNinguno()
	{
		_id = ID_UNDEFINED;
		_idContainer.setNinguno();
	}

	void setContainerId(const IdJuego& id) {
		_idContainer = id;
	}

	T_ID_JUEGO getContainerId() const {
		return _idContainer.getId();
	}

	const IdJuego& getJuego() const
	{
		return _idContainer;
	}

	bool isDefined() {
		return _id != ID_UNDEFINED;
	}

	bool operator == (const IdJugador& otro)
	{
		return _idContainer == otro._idContainer && _id == otro._id;
	}

	bool operator != (const IdJugador& otro) const
	{
		return !(otro == *this);
	}

	bool operator < (const IdJugador& otro) const
	{
		return _idContainer < otro._idContainer ||
				(_idContainer == otro._idContainer && _id < otro._id);
	}

	bool operator > (const IdJugador& otro) const
	{
		return otro < *this;
	}

	void saveToMensaje (aplicacion::t_identificadorFuente& id) const
	{
		_idContainer.saveToMensaje(id);
		id.contenido = _id;
	}

	void loadFromMensaje (const aplicacion::t_identificadorFuente& id)
	{
		_idContainer.loadFromMensaje(id);
		_id = id.contenido;
	}

	bool operator == (const IdJugador& otro) const
	{
		return _id == otro._id && _idContainer == otro._idContainer;
	}

private:
	friend std::ostream &operator<<( std::ostream &stream, const IdJugador &obj );
};

#endif /* IDJUGADOR_H_ */
